﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <vector>
using namespace std;


// 1、扑克牌顺子
//
//现在有2副扑克牌，从扑克牌中随机五张扑克牌，我们需要来判断一下是不是顺子。
//有如下规则：
//1. A为1，J为11，Q为12，K为13，A不能视为14
//2. 大、小王为 0，0可以看作任意牌
//3. 如果给出的五张牌能组成顺子（即这五张牌是连续的）就输出true，否则就输出false。
//4.数据保证每组5个数字，每组最多含有4个零，数组的数取值为[0, 13]



class Solution
{
public:
    bool IsContinuous(vector<int> numbers)
    {
        //  1 2 3 4 5 6 7 8 9 10 11 12 13
        sort(numbers.begin(), numbers.end());
        int zero_num = 0;
        int i = 0;
        while (numbers[i] == 0)
        {
            zero_num++;
            i++;
        }

        int interrapt = 0;

        for (; i < numbers.size() - 1; ++i)
        {
            if (numbers[i] == numbers[i + 1])
            {
                return false;
            }

            interrapt += numbers[i + 1] - numbers[i] - 1;
        }

        if (zero_num >= interrapt)
        {
            return true;
        }

        return false;
    }
};



// 2、图像渲染
//
//有一幅以 m x n 的二维整数数组表示的图画 image ，其中 image[i][j] 表示该图画的像素值大小。
//
//你也被给予三个整数 sr, sc 和 newColor 。你应该从像素 image[sr][sc] 开始对图像进行 上色填充 。
//
//为了完成 上色工作 ，从初始像素开始，记录初始坐标的 上下左右四个方向上 像素值与初始坐标相同的相连像素点，
//接着再记录这四个方向上符合条件的像素点与他们对应 四个方向上 像素值与初始坐标相同的相连像素点，……，重复该过程。将所有有记录的像素点的颜色值改为 newColor 。
//
//最后返回 经过上色渲染后的图像 。



class Solution
{
public:
    // x 或 y 走的步数
    const int dx[4] = { 1, 0, 0, -1 };
    const int dy[4] = { 0, 1, -1, 0 };

    void dfs(vector<vector<int>>& image, int sr, int sc, int color, int FlagColor)
    {
        if (image[sr][sc] == FlagColor)
        {
            image[sr][sc] = color;

            for (int i = 0; i < 4; ++i)
            {
                int mx = sr + dx[i];
                int my = sc + dy[i];

                if (mx >= 0 && mx < image.size() && my >= 0 && my < image[0].size())
                {
                    dfs(image, mx, my, color, FlagColor);
                }
            }
        }

    }


    vector<vector<int>> floodFill(vector<vector<int>>& image, int sr, int sc, int color)
    {
        int FlagColor = image[sr][sc];

        if (color == FlagColor)
        {
            return image;
        }
        else
        {
            dfs(image, sr, sc, color, FlagColor);
        }

        return image;


    }
};




// 3、岛屿的最大面积
//
//给你一个大小为 m x n 的二进制矩阵 grid 。
//
//岛屿 是由一些相邻的 1 (代表土地) 构成的组合，这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0（代表水）包围着。
//
//岛屿的面积是岛上值为 1 的单元格的数目。
//
//计算并返回 grid 中最大的岛屿面积。如果没有岛屿，则返回面积为 0 。


class Solution
{
public:
    int dfs(int x, int y, vector<vector<int>>& grid)
    {
        if (x >= 0 && x < grid.size() && y >= 0 && y < grid[0].size() && grid[x][y] == 1)
        {
            grid[x][y] = 0;

            return 1 + dfs(x - 1, y, grid)
                + dfs(x + 1, y, grid)
                + dfs(x, y - 1, grid)
                + dfs(x, y + 1, grid);
        }

        return 0;
    }

    int maxAreaOfIsland(vector<vector<int>>& grid)
    {
        int Max = 0;
        for (int i = 0; i < grid.size(); ++i)
        {
            for (int j = 0; j < grid[0].size(); ++j)
            {
                int ans = dfs(i, j, grid);
                Max = max(Max, ans);
            }
        }

        return Max;
    }
};